package com.sheng.leetcode.year2022.month07.day08;

import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

/**
 * @author liusheng
 * @date 2022/07/08
 *
 * 1217. 玩筹码
 *
 * 有 n 个筹码。第 i 个筹码的位置是 position[i] 。
 * 我们需要把所有筹码移到同一个位置。在一步中，我们可以将第 i 个筹码的位置从 position[i] 改变为:
 * position[i] + 2 或 position[i] - 2 ，此时 cost = 0
 * position[i] + 1 或 position[i] - 1 ，此时 cost = 1
 * 返回将所有筹码移动到同一位置上所需要的 最小代价 。
 *
 * 示例 1：
 * 输入：position = [1,2,3]
 * 输出：1
 * 解释：第一步:将位置3的筹码移动到位置1，成本为0。
 * 第二步:将位置2的筹码移动到位置1，成本= 1。
 * 总成本是1。
 *
 * 示例 2：
 * 输入：position = [2,2,2,3,3]
 * 输出：2
 * 解释：我们可以把位置3的两个筹码移到位置2。每一步的成本为1。总成本= 2。
 *
 * 示例 3:
 * 输入：position = [1,1000000000]
 * 输出：1
 *
 * 提示：
 *
 * 1 <= chips.length <= 100
 * 1 <= chips[i] <= 10^9
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/minimum-cost-to-move-chips-to-the-same-position
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class LeetCode1217 {

    @Test
    public void test01(){
//        int[] position = {1,2,3};
//        int[] position = {2,2,2,3,3};
        int[] position = {1,1000000000};
        System.out.println(new Solution().minCostToMoveChips(position));
    }

}
class Solution {
    public int minCostToMoveChips(int[] position) {
        int min = Integer.MAX_VALUE;
        Map<Integer, Integer> map = new HashMap<>(16);
        //获取每个坐标位置上面点的数量
        for (int i = 0; i < position.length; i++) {
            map.put(position[i], map.getOrDefault(position[i], 0) + 1);
        }
        //依此将每个点作为集中点，判断cost，取得最小cost值
        for (Integer integers : map.keySet()) {
            int cost = 0;
            for (Integer integer : map.keySet()) {
                //根据题意可得，移动位置为偶数时，cost为0，移动位数为奇数时cost为1
                cost += Math.abs(integer - integers) % 2 * map.get(integer);
            }
            if (cost < min) {
                min = cost;
            }
        }
        return min;
    }
}
